home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
data
/
happypas
/
bio.pas
next >
Wrap
Pascal/Delphi Source File
|
1993-11-30
|
8KB
|
218 lines
{*********************************************************************
* *** バイオリズム *** *
* *
* HAPPyのサンプルプログラム *
* (作者 浅野比富美 Public Domain Software) *
*********************************************************************}
program Biorhythm(input,output) ;
type kanji = packed array[1..2] of char ; { 全角1文字(漢字) }
var Nissu : array[1..12] of 1..31 ; { 月の日数を格納 }
yb,mb,db : integer ; { 生まれた年、月,日 }
yp,mp : integer ; { 出力したい年、月 }
Ychar : kanji ; { 漢字の曜日 }
{*****************************************
* 初期設定 (各月の日数を設定) *
* とりあえず 2月は28日としておく *
*****************************************}
procedure Init ;
begin
Nissu[ 1] := 31 ; Nissu[ 2] := 28 ; Nissu[ 3] := 31 ;
Nissu[ 4] := 30 ; Nissu[ 5] := 31 ; Nissu[ 6] := 30 ;
Nissu[ 7] := 31 ; Nissu[ 8] := 31 ; Nissu[ 9] := 30 ;
Nissu[10] := 31 ; Nissu[11] := 30 ; Nissu[12] := 31
end {Init} ;
{***************************************
* y年m月d日の曜日を算出する *
***************************************}
procedure Youbi(y{年},m{月},d{日}:integer; var Ychar:kanji) ;
var m1,y1 : integer;
begin
if m >= 3 then begin m1 := m - 2 ; y1 := y end
else begin m1 := m + 10 ; y1 := y - 1 end ;
case (y1 + y1 div 4 - y1 div 100 + y1 div 400
+ trunc(2.6*m1 - 0.19) + d) mod 7 of
0 : Ychar := '日' ;
1 : Ychar := '月' ;
2 : Ychar := '火' ;
3 : Ychar := '水' ;
4 : Ychar := '木' ;
5 : Ychar := '金' ;
6 : Ychar := '土'
end
end {Youbi} ;
{*****************************************
* year年が閏年の時、真を返す関数 *
* 4年に一度だが、、100年に一度閏年で *
* なく、400年に一度閏年になります *
*****************************************}
function Uruu(year:integer) : Boolean ;
begin
Uruu := (year mod 4 = 0) and (year mod 100 <> 0) or (year mod 400 = 0)
end {Uruu} ;
{*******************************
* 閏年の2月日数補正 *
*******************************}
procedure UruuFeb(year : integer) ;
begin
if Uruu(year) then Nissu[2{月}] := 29{日}
else Nissu[2{月}] := 28{日}
end {UruuFeb} ;
{*******************************
* 入力処理 *
*******************************}
procedure InputInformation ;
var Gengo : char ; { 元号 m / t / s / h }
UnderMonth : 1..12 ; { 入力可能な出力月の下限 }
ok : Boolean ; { 入力チェック用フラグ }
begin
writeln('***** 誕生日を教えて下さい *****');
repeat
write(' 明治・・・m 大正・・・t 昭和・・・s 平成・・・h ? ') ;
readln(Gengo{元号})
until (Gengo='m') or (Gengo='t') or (Gengo='s') or (Gengo='h') ;
{ 集合の元の順序数に制約がなければ
until Gengo in ['m','t','s','h'] と するのが良い }
repeat
write(' 何年 ? ') ;
readln(yb) ;
case Gengo of { 範囲チェック & 西暦変換 }
'm' : begin ok:=(1<=yb) and (yb<={明治}45{年}) ; yb:=yb+1867 end ;
't' : begin ok:=(1<=yb) and (yb<={大正}15{年}) ; yb:=yb+1911 end ;
's' : begin ok:=(1<=yb) and (yb<={昭和}64{年}) ; yb:=yb+1925 end ;
'h' : begin ok:=(1<=yb) and (yb<={平成}50{年}) ; yb:=yb+1988 end
{ ↑ 平成は仮の値です }
end
until ok ;
repeat
write(' 何月 ? ') ;
readln(mb)
until (1{月}<=mb) and (mb<=12{月}) ;
UruuFeb(yb) ; { 誕生年の2月の日数補正 }
repeat
write(' 何日 ? ') ;
readln(db)
until (1{日}<=db) and (db<=Nissu[mb]) ;
writeln('***** バイオリズムを出したい年、月を教えて下さい *****');
repeat
write(' 何年(西暦',yb:4,'~9999) ? ') ; { 9999年に意味はない }
readln(yp)
until (yb<=yp) and (yp<=9999{年}) ;
if yb=yp then UnderMonth := mb { 誕生年と出力年が同じならば }
else UnderMonth := 1{月} ; { 出力月は、誕生月以降である }
repeat
write(' 何月(',UnderMonth:2,'~',12:2,') ? ') ;
readln(mp)
until (UnderMonth<=mp) and (mp<=12{月})
end {InputInformation} ;
{*******************************
* 生存日数算出 *
*******************************}
function LivingDay : integer ;
var year,month : integer ; { for文の制御変数 }
day : integer ; { 生存日 }
begin
day := 0 ;
for year := yb to yp-1 do { 誕生年~出力年前年の日数算出}
if Uruu(year) then day := day + 366{日} { 閏年は366日加える }
else day := day + 365{日} ; { 平年は365日 }
UruuFeb(yb) ; { 誕生年の2月の日数補正 }
for month := 1 to mb-1 do { 誕生年の日数を補正 }
day := day - Nissu[month] ;
day := day - db + 1 ; { 誕生月の日数を補正 }
UruuFeb(yp) ; { 出力年の2月の日数補正 }
for month := 1 to mp-1 do { 出力年の日数を加える }
day := day + Nissu[month] ;
LivingDay := day { 関数の戻り値(生存日) }
end {LivingDay} ;
{*******************************
* グラフ作成&出力処理 *
*******************************}
procedure Graph ;
const pai = 3.141593 ; { 円周率 }
Vmax = 8 ; { 縦軸方向の振幅値}
Hbias = 6 ; { 横方向のバイアス}
type xRange = 1..31 ; { 横軸範囲 日数分 }
yRange = -Vmax..Vmax ; { 縦軸範囲 }
var point : array[xRange,yRange] of kanji ; { グラフ座標 }
x : xRange ; { for文の制御変数 }
y : yRange ; { for文の制御変数 }
day : integer ; { 生存日数 }
pai2 : real ; { 2*円周率 (1円周ラジアン) }
begin
day := LivingDay ; { 1日までの生存日数算出 }
for x:=1 to 31 do { グラフエリアの初期設定 }
for y:=-Vmax to Vmax do
point[x,y] := ' ' ;
for x:=1 to 31 do
begin
point[x, Vmax] := '-' ;
point[x, 0] := '-' ;
point[x,-Vmax] := '-'
end ;
pai2 := 2.0 * pai ; { 1円周(ラジアン) }
for x := 1 to Nissu[mp] do { P(身体) S(感情) I(知性)について座標計算}
begin
point[x, round(sin(pai2*(day mod 23)/23) * Vmax)] := 'P' ; {23日周期}
point[x, round(sin(pai2*(day mod 28)/28) * Vmax)] := 'S' ; {28日周期}
point[x, round(sin(pai2*(day mod 33)/33) * Vmax)] := 'I' ; {33日周期}
day := day + 1
end ;
Youbi(yb,mb,db,Ychar) ; { 誕生日の曜日算出 }
page ; { 画面クリア }
writeln(' ':Hbias,'*******',
' バイオリズム (',yp:4,'年',mp:2,'月) P:身体 S:感情 I:知性 ',
'*******') ;
writeln(' ':Hbias+3,yb:4,'年',mb:2,'月',db:2,'日(',Ychar,')生まれ ',
' 1日現在の満生存日数は',LivingDay:5,'日') ;
writeln ;
write(' ':Hbias) ;
for x:=1 to Nissu[mp] do { 日を出力 }
write(x:2) ;
writeln ;
write(' ':Hbias) ;
for x:=1 to Nissu[mp] do { 曜日を出力 }
begin
Youbi(yp,mp,x,Ychar) ;
write(Ychar)
end ;
writeln ;
for y:=Vmax downto -Vmax do { グラフを出力 }
begin
write(' ':Hbias) ;
for x:=1 to Nissu[mp] do
write(point[x,y]) ;
writeln
end
end {Graph} ;
{****************************
* メイン処理 *
****************************}
begin {main}
Init ; { 初期設定 }
InputInformation ; { 誕生日、出力年月入力 }
Graph { グラフ作成&出力 }
end.